package com.sheng.leetcode.year2022.month12.day21;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2022/12/21
 * <p>
 * 1753. 移除石子的最大得分<p>
 * <p>
 * 你正在玩一个单人游戏，面前放置着大小分别为 a 、b 和 c 的 三堆 石子。<p>
 * 每回合你都要从两个 不同的非空堆 中取出一颗石子，并在得分上加 1 分。当存在 两个或更多 的空堆时，游戏停止。<p>
 * 给你三个整数 a 、b 和 c ，返回可以得到的 最大分数 。<p>
 * <p>
 * 示例 1：<p>
 * 输入：a = 2, b = 4, c = 6<p>
 * 输出：6<p>
 * 解释：石子起始状态是 (2, 4, 6) ，最优的一组操作是：<p>
 * - 从第一和第三堆取，石子状态现在是 (1, 4, 5)<p>
 * - 从第一和第三堆取，石子状态现在是 (0, 4, 4)<p>
 * - 从第二和第三堆取，石子状态现在是 (0, 3, 3)<p>
 * - 从第二和第三堆取，石子状态现在是 (0, 2, 2)<p>
 * - 从第二和第三堆取，石子状态现在是 (0, 1, 1)<p>
 * - 从第二和第三堆取，石子状态现在是 (0, 0, 0)<p>
 * 总分：6 分 。<p>
 * <p>
 * 示例 2：<p>
 * 输入：a = 4, b = 4, c = 6<p>
 * 输出：7<p>
 * 解释：石子起始状态是 (4, 4, 6) ，最优的一组操作是：<p>
 * - 从第一和第二堆取，石子状态现在是 (3, 3, 6)<p>
 * - 从第一和第三堆取，石子状态现在是 (2, 3, 5)<p>
 * - 从第一和第三堆取，石子状态现在是 (1, 3, 4)<p>
 * - 从第一和第三堆取，石子状态现在是 (0, 3, 3)<p>
 * - 从第二和第三堆取，石子状态现在是 (0, 2, 2)<p>
 * - 从第二和第三堆取，石子状态现在是 (0, 1, 1)<p>
 * - 从第二和第三堆取，石子状态现在是 (0, 0, 0)<p>
 * 总分：7 分 。<p>
 * <p>
 * 示例 3：<p>
 * 输入：a = 1, b = 8, c = 8<p>
 * 输出：8<p>
 * 解释：最优的一组操作是连续从第二和第三堆取 8 回合，直到将它们取空。<p>
 * 注意，由于第二和第三堆已经空了，游戏结束，不能继续从第一堆中取石子。<p>
 * <p>
 * 提示：<p>
 * 1 <= a, b, c <= 10^5<p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/maximum-score-from-removing-stones">1753. 移除石子的最大得分</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode1753 {

    @Test
    public void test01() {
//        int a = 2, b = 4, c = 6;
//        int a = 4, b = 4, c = 6;
        int a = 1, b = 8, c = 8;
        System.out.println(new Solution().maximumScore(a, b, c));
    }
}

class Solution {
    public int maximumScore(int a, int b, int c) {
        /**
         * 思路：将 a， b， c 中最小的一个和最大的一个同时减一操作，如果是按照从小到大的顺序排列的
         * 当 a + b <= c 时，返回 a + b
         * 当 a + b > c 时，按照上面的规则，先将 c 置为 0，然后再计算 a 和 b
         */
        if (a > b) {
            return maximumScore(b, a, c);
        }
        if (b > c) {
            return maximumScore(a, c, b);
        }
        if (a + b <= c) {
            return a + b;
        }
        return (a + b + c) / 2;
    }
}
